package com.warrior.gatherweb.exceptionhandler;

import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;

/**
 * 全局异常处理
 * 如果由于参数原因，没进处理的controller类，那么就会在这里进行处理
 */
@ControllerAdvice
@ResponseBody
@Slf4j
public class GlobalExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    public CommonResult customerErrorHandler(HttpServletRequest req, Exception e) {
        log.error("全局异常处理 ： {} 调用 {} 发生 {} 错误", req.getRemoteHost(), req.getMethod(), e.getMessage());
        e.printStackTrace();
        // 返回通用数据结构 附加异常信息
        return new CommonResult(ResultCode.FAIL_CODE, e.getClass().getName(), e.getMessage(), null);
    }

    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public CommonResult notNullFieldErrorHandler(HttpServletRequest req, MethodArgumentNotValidException ex) {
        // 记录日志信息
        log.error("全局异常捕获： ip - {} req - {} error - {}", req.getRemoteHost(), req.getServletPath(), "请求字段有非空验证");
        BindingResult errors = ex.getBindingResult();
        String msg = "";
        if (errors.hasErrors()) {
            //打印错误
            msg = errors.getFieldError().getDefaultMessage();
        }
        // 返回通用数据结构 附加异常信息
        return new CommonResult(ResultCode.FAIL_CODE, String.format(msg), null, null);
    }

}